OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1. QR码的简介
QR码是二维条码的一种,QR 来自英文 “Quick Response” 的缩写,即快速反应的意思,源自发明者希望 QR 码可让其内容快速被解码。QR码不仅信息容量大、可靠性高、成本低,还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的。
2. QR码的结构
图片 | 解析 |
---|---|
定位标识 (Positioning markings)标明二维码的方向。 | |
对齐标记(Alignment markings)如果二维码很大,这些附加元素帮助定位。 | |
计算模式(Timing pattern)通过这些线,扫描器可以识别矩阵有多大。 | |
版本信息(Version information)这里指定正在使用的QR码的版本号,目前有QR码有40个不同的版本号。 用于销售行业的的版本号通常为1-7。 | |
格式信息(Format information)格式模式包含关于容错和数据掩码模式的信息,并使得扫描代码更加容易。 | |
数据和错误校正值(Data and error correction keys)这些模式保存实际数据。 | |
宁静区域(Quiet zone)这个区域对于扫描器来说非常重要,它的作用就是将自身与周边的进行分离。 |
3. QR码的特点
QR码中数据值包含重复的信息(冗余值)。因此,即使多达30%的二维码结构被破坏,而不影响二维码的可读性。QR码的存储空间多达7089位或者是4296个字符,包括标点符号和特殊字符,都可以写入QR码中。除了数字和字符之外,还可以对单词和短语(例如网址)进行编码。随着更多的数据被添加到QR码,代码大小增加,代码结构变得更加复杂。
4. QR二维码创建与识别
安装(注意,如果使用jetbotmini官方镜像可以跳过此步骤)
python3 -m pip install qrcode pyzbar
sudo apt-get install libzbar-dev
创建qrcode对象
xxxxxxxxxx
'''
参数含义:
version:值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。
如果想让程序自动确定,将值设置为 None 并使用 fit 参数即可。
error_correction:控制二维码的错误纠正功能。可取值下列4个常量。
ERROR_CORRECT_L:大约7%或更少的错误能被纠正。
ERROR_CORRECT_M(默认):大约15%或更少的错误能被纠正。
ROR_CORRECT_H:大约30%或更少的错误能被纠正。
box_size:控制二维码中每个小格子包含的像素数。
border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
'''
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=5,
border=4,)
qrcode二维码添加logo
xxxxxxxxxx
# 如果logo地址存在,就添加logo图片
my_file = Path(logo_path)
if my_file.is_file(): img = add_logo(img, logo_path)
注意:使用中文时,需加中文字符
直接使用python3 QRcode_Create.py执行即可,然后输入要生成的内容,回车确认。
xxxxxxxxxx
def decodeDisplay(image, font_path):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 需要先把输出的中文字符转换成Unicode编码形式
barcodes = pyzbar.decode(gray)
for barcode in barcodes:
# 提取二维码的边界框的位置
(x, y, w, h) = barcode.rect
# 画出图像中条形码的边界框
cv.rectangle(image, (x, y), (x + w, y + h), (225, 0, 0), 5)
encoding = 'UTF-8'
# 画出来,就需要先将它转换成字符串
barcodeData = barcode.data.decode(encoding)
barcodeType = barcode.type
# 绘出图像上数据和类型
pilimg = Image.fromarray(image)
# 创建画笔
draw = ImageDraw.Draw(pilimg)
# 参数1:字体文件路径,参数2:字体大小
fontStyle = ImageFont.truetype(font_path, size=12, encoding=encoding)
# 参数1:打印坐标,参数2:文本,参数3:字体颜色,参数4:字体
draw.text((x, y - 25), str(barcode.data, encoding), fill=(255, 0, 0), font=fontStyle)
# PIL图片转cv2 图片
image = cv.cvtColor(np.array(pilimg), cv.COLOR_RGB2BGR)
# 向终端打印条形码数据和条形码类型
print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
return image
效果演示
直接使用python3 QRcode_Parsing.py文件执行即可
相应具体源代码位于/home/jetson/workspace/catkin_ws/src/jetbot_ros/scripts/simple_qrcode